package es.eupt.amazingpi.server.threads;

import java.net.Socket;
import java.util.ArrayList;

import es.eupt.amazingpi.model.juego.Ficha;
import es.eupt.amazingpi.model.juego.FichaJugador;
import es.eupt.amazingpi.model.juego.Jugador;
import es.eupt.amazingpi.model.juego.MensajeJuego;
import es.eupt.amazingpi.model.usuario.Usuario;
import es.eupt.amazingpi.server.gestion.GestionJuego;
import es.eupt.amazingpi.sync.MensajeInputStream;
import es.eupt.amazingpi.sync.MensajeOutputStream;

public class HiloJuego extends Thread {

	private ArrayList<HiloUsuario> jugadores;
	private ArrayList<FichaJugador> fichasResueltas;
	private int limiteJugadores;
	private boolean pi = false;
	private Usuario usuarioPi;
	
	public HiloJuego (ArrayList<HiloUsuario> usuarios){
		this.jugadores = usuarios;
	}
	
	public Ficha crearFicha(){
		String[] categorias = {"Nombre","Ciudad", "Comida", "Animal"};
		Ficha ficha = new Ficha(categorias);
		return ficha;
	}
	
	public boolean anyadirJugador(Jugador jugador, Socket socket) {
		try {
			if (jugadores.size()<limiteJugadores){
				MensajeInputStream entrada =	new MensajeInputStream(socket.getInputStream());
				MensajeOutputStream salida = new MensajeOutputStream(socket.getOutputStream());
				HiloUsuario hilo = new HiloUsuario(jugador, socket, entrada, salida);
				jugadores.add(hilo);
			}
		} catch(Exception e){
			
		}
		return false;
	}

	public int getLimiteJugadores() {
		return limiteJugadores;
	}

	public void setLimiteJugadores(int limiteJugadores) {
		this.limiteJugadores = limiteJugadores;
	}
	
	public void conectarAJuego(){
		for (int i = 0; i<jugadores.size(); i++){
			HiloUsuario hilo = jugadores.get(i);
			hilo.iniciarJuego(this);
		}
	}
	
	public void enviarAtodos(MensajeJuego mensaje){
		for (int i = 0; i<jugadores.size(); i++){
			HiloUsuario hilo = jugadores.get(i);
			hilo.escribir(mensaje);
		}
	}

	public void enviarFicha(Ficha ficha){
		MensajeJuego mensaje = new MensajeJuego();
		mensaje.setCodigo(MensajeJuego.CODIGO_FICHA);
		mensaje.setFicha(ficha);
		enviarAtodos(mensaje);
	}
	
	@Override
	public void run() {
		conectarAJuego();
		enviarFicha(crearFicha());
		fichasResueltas = new ArrayList<FichaJugador>();
	}
	
	public void pi(String jugador){
		MensajeJuego mensaje = new MensajeJuego(MensajeJuego.CODIGO_PI);
		mensaje.setEmisor(jugador);
		enviarAtodos(mensaje);
	}
	
	public void recibirFichaResuelta(Ficha ficha, String jugador){
		FichaJugador fj = new FichaJugador(jugador, ficha);
		fichasResueltas.add(fj);
		if (fichasResueltas.size()==jugadores.size()){
			evaluarFichas();
		}
	}
	
	public void evaluarFichas(){
//		fichasResueltas = GestionJuego.puntuarFichas(fichasResueltas);
	}
	
	public synchronized boolean hacerPi(Usuario usuario) {
		if (!pi){
			pi = true;
			usuarioPi = usuario;
		}
		return pi;
	}
	
	public synchronized boolean isPi(){
		return pi;
	}
	
	public synchronized Usuario getUsuarioPi(){
		return usuarioPi;
	}
	
	
}
